package cn.tedu.oop;

import java.util.InputMismatchException;
import java.util.Scanner;

/*本类用作异常的入门案例*/
public class ExceptionDemo {
    public static void main(String[] args) throws Exception {
        //method1();//调用暴露异常的方法//(怎么看异常,异常长什么样)
        //method2();//调用解决异常的方案1--捕获处理--自己解决(调试和分析方法里面的代码)
        f();//不能向jvm顶级抛异常后,抛出方法给处理异常的programmer来解决
        //method3();//调用解决异常的方案2--向上抛出--别人解决(调试和分析方法整体抛出的异常)
    }

    //解决method3()抛出的异常
    private static void f() throws Exception{
        try {
            method3();
        }/*catch (Exception e){
            System.out.println("输入的数据不对!");
        }*/catch (ArithmeticException e){//异常类型 异常名
            System.out.println("除数不能为0!");
        }catch (InputMismatchException e){  //导包util下面的导类InputMismatchException
            System.out.println("请输出规定的整数!");
            /*使用多态的思想,不论是什么子异常,统一看作父类型Exception
             * 做出更加通用的解决方案,甚至可以只写这1个,上面2个不写了*/
        }catch (Exception e){ //Exception是所有编码异常子类的父类,
            System.out.println("您输入的数据不对,请重新输入~");
        }
    }

    /*如果一个方法抛出了异常,那么谁来调用这个方法,谁就需要处理这个异常
     * 这里的处理也有两种方法:捕获解决 或者 继续向上抛出
     * 但注意:我们一般会在main()调用之前将异常解决掉
     * 而不是将问题抛给main(),因为没人解决了,该报错还报错*/

    /*异常抛出的格式:在方法的小括号与大括号之间,写:throws 异常类型
     * 如果有多个异常,使用逗号分隔即可*/
    //private static void method3() throws ArithmeticException,InputMismatchException,Exception{
    private static void method3() /*throws Exception*/{  //(简写)方法逐级往上抛出,先在捕获异常的方法抛出e,然后再逐级向上,在调用捕获e的主方法抛出异常
        //1.复写之前可能会抛出异常代码
        System.out.println("请您输入要计算的第1个整数:");
        int a = new Scanner(System.in).nextInt();
        System.out.println("请您输入要计算的第2个整数:");
        int b = new Scanner(System.in).nextInt();
        System.out.println(a/b);
    }
    /*异常捕获处理的格式:
    try{
        可能会抛出异常的代码
    }catch(预先设想的异常类型 异常名){
        万一捕获到了异常,进行处理的解决方案
    }
    try-catch结构可以嵌套,如果有多种异常类型需要特殊处理的话
    * */
    private static void method2() {
        //1.按照捕获处理的结构完成代码
        try{
            //2.复写一下刚刚的业务代码
            System.out.println("请您输入要计算的第1个整数:");
            int a = new Scanner(System.in).nextInt();
            System.out.println("请您输入要计算的第2个整数:");
            int b = new Scanner(System.in).nextInt();
            System.out.println(a/b);
        }catch (ArithmeticException e){//异常类型 异常名
            System.out.println("除数不能为0!");
        }catch (InputMismatchException e){  //导包util下面的导类InputMismatchException
            System.out.println("请输出规定的整数!");
            /*使用多态的思想,不论是什么子异常,统一看作父类型Exception
             * 做出更加通用的解决方案,甚至可以只写这1个,上面2个不写了*/
        }catch (Exception e){ //Exception是所有编码异常子类的父类,
            System.out.println("您输入的数据不对,请重新输入~");
        }
    }
    private static void method1() {
        //1.提示并接收用户输入的两个整数
        System.out.println("请您输入要计算的第1个整数:");
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        System.out.println("请您输入要计算的第2个整数:");
        int b = new Scanner(System.in).nextInt();
        //2.输出a b 做除法的结果
        System.out.println(a/b);
        //输入:10和0,报错:ArithmeticException--算术异常,除数不能为0,数学规定
        //输入:10和3.4,报错:InputMismatchException--输入不匹配异常
        /*1.不要害怕BUG,真正的勇士敢于直面自己写的BUG*/
        /*2.学会看报错的信息提示,确定自己错误的方向*/
        /*3.学会看报错的行号提示,确定自己报错的位置,哪里不对点哪里
         * 注意:源码不会错,要看自己写的代码*/
    }
}
